﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include<stdio.h>
////这里发现在vs里面c++可以兼容c的代码
//int main()
//{
//	printf("hello world\n");
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	cout << "hello world" << endl;
//	return 0;
//}



//#include<stdio.h>
//
//int rand = 10;
//int main()
//{
//	printf("%d\n", rand);
//	return 0;
//}

//#include <stdlib.h>
//#include<stdio.h>
//
//int rand = 10;
//
//int main()
//{
//	// 编译报错：error C2365: “rand”: 重定义；以前的定义是“函数” 
//	printf("%d\n", rand);
//	return 0;
//}


//#include <stdlib.h>
//#include<stdio.h>
//namespace hhz //hhz个人给命名空间取的名字
//{
//	//命名空间里面可以是变量/函数/类型
//
//	int rand = 1;
//
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//
//int main()
//{
//	//这里访问的是指针
//	printf("%p\n", rand);
//	//这里访问的是命名空间里面的整型
//	printf("%d\n", hhz::rand);
//	return 0;
//}



//#include <stdlib.h>
//#include<stdio.h>
//namespace hzz
//{
//	namespace hh
//	{
//		int rand = 10;
//		int Add(int left, int right)
//		{
//			return left + right;
//		}
//	}
//	namespace ff
//	{
//		int rand = 20;
//		int Add(int left, int right)
//		{
//			return (left + right) * 10;
//		}
//	}
//}
//int main()
//{
//	printf("hh rand = %d\n", hzz::hh::rand);
//	printf("hh Add = %d\n", hzz::hh::Add(2, 3));
//	printf("ff rand = %d\n", hzz::ff::rand);
//	printf("ff Add = %d\n", hzz::ff::Add(2, 3));
//	return 0;
//}


// Stack.cpp
/////////////////////////////////////////////////////////////////////////这里有问题///////////////////////////////////////////////////////////
//#include"Stack.h"
//
//namespace bit
//{
//	void STInit(ST* ps, int n)
//	{
//		assert(ps);
//		ps->a = (STDataType*)malloc(n * sizeof(STDataType));
//		ps->top = 0;
//		ps->capacity = n;
//	}
//	// 栈顶 
//	void STPush(ST* ps, STDataType x)
//	{
//		assert(ps);
//		// 满了， 扩容 
//		if (ps->top == ps->capacity)
//		{
//			printf("扩容\n");
//			int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//			STDataType* tmp = (STDataType*)realloc(ps->a,
//				newcapacity * sizeof(STDataType));
//			if (tmp == NULL)
//			{
//				perror("realloc fail");
//				return;
//			}
//				ps->a = tmp;
//			ps->capacity = newcapacity;
//		}
//		ps->a[ps->top] = x;
//		ps->top++;
//	}
//
//
//// Queue.cpp
//#include"Queue.h"
//
//namespace bit
//{
//	void QueueInit(Queue* pq)
//	{
//		assert(pq);
//		pq->phead = NULL;
//		pq->ptail = NULL;
//		pq->size = 0;
//	}
//	// ...
//}
//
//// test.cpp
//
//#include"Queue.h"
//
//#include"Stack.h"
//
//// 全局定义了⼀份单独的Stack 
//
//typedef struct Stack
//{
//	int a[10];
//	int top;
//}ST;
//
//void STInit(ST* ps) {}
//
//void STPush(ST* ps, int x) {}
//
//int main()
//{
//	// 调⽤全局的 
//	ST st1;
//	STInit(&st1);
//	STPush(&st1, 1);
//	STPush(&st1, 2);
//	printf("%d\n", sizeof(st1));
//	// 调⽤bit namespace的 
//	bit::ST st2;
//	printf("%d\n", sizeof(st2));
//	bit::STInit(&st2);
//	bit::STPush(&st2, 1);
//	bit::STPush(&st2, 2);
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//namespace hhz
//{
//	int a = 5;
//	int b = 10;
//}
//// 展开命名空间中全部成员 
//using namespace hhz;
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}




//using hhz::a;//使用using将命名空间某个成员展开
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", hhz::b);
//	return 0;
//}




//int main()
//{
//	//访问指定空间的变量
//	printf("%d\n", hhz::a);
//	return 0;
//}



//int main()
//{
//	printf("%d\n", a);// 编译报错：error C2065: “a”: 未声明的标识符 
//	return 0;
//}

//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 1;
//	double b = 3.3;
//	char c = 'x';
//	cout << a << " " << b << " " << c << endl;
//	scanf("%d %lf", &a, &b);
//	printf("%d %lf", a, b);
//	return 0;
//}



//#include<stdio.h>
//#include<iostream>
//#include<stdlib.h>
//using namespace std;
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//
//int main()
//{
//	Func();// 没有传参时，使⽤参数的默认值
//	Func(10);// 传参时，使⽤指定的实参 
//	return 0;
//}



//#include <iostream>
//#include<stdio.h>
//using namespace std;
//
//// 全缺省 
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//// 半缺省 
//void Func2(int a, int b = 10, int c = 20)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//int main()
//{
//	Func1();
//	Func1(1);
//	Func1(1, 2);
//	Func1(1, 2, 3);
//	Func2(100);
//	Func2(100, 200);
//	Func2(100, 200, 300);
//	return 0;
//}




//#include <iostream>
//#include<stdio.h>
//using namespace std;
//
////1.参数类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int left,int right)" << endl;
//	return left + right;
//}
//double Add(double left, double right)
//{
//	cout << "double Add(double left,double right)" << endl;
//	return left + right;
//}
//
////2.参数个数不同
//void Func()
//{
//	cout << "Func()" << endl;
//}
//
//void Func(int a)
//{
//	cout << "Func(int a)" << endl;
//}
//
////3. 参数位置不同
//
//void F(int a, double b)
//{
//	cout << "F(int a, double b)" << endl;
//}
//
//void F(double b, int a)
//{
//	cout << "F(double b, int a)" << endl;
//}
//
//int main()
//{
//	Add(10, 2);
//	Add(2.2 , 3.3);
//	Func();
//	Func(10);
//	F(1, 2.2);
//	F(1.1, 2);
//	return 0;
//}




//#include<iostream>
//#include<stdio.h>
//
//using namespace std;
//
//// 1、参数类型不同 
//
//int Add(int left, int right)
//{
//	cout << "int Add(int left, int right)" << endl;
//	return left + right;
//}
//
//double Add(double left, double right)
//{
//	cout << "double Add(double left, double right)" << endl;
//	return left + right;
//}
//
//// 2、参数个数不同 
//
//void f()
//{
//	cout << "f()" << endl;
//}
//
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
//
//// 3、参数类型顺序不同 
//
//void f(int a, char b)
//{
//	cout << "f(int a,char b)" << endl;
//}
//
//void f(char b, int a)
//{
//	cout << "f(char b, int a)" << endl;
//}
//
//// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分 
//
////void fxx()
////{}
////
////int fxx()
////{
//// return 0;
////}
//// 下⾯两个函数构成重载 
//
//// f()但是调⽤时，会报错，存在歧义，编译器不知道调⽤谁 
//
//void f1()
//{
//	cout << "f()" << endl;
//}
//
//void f1(int a = 10)
//{
//	cout << "f(int a)" << endl;
//}
//
//int main()
//{
//	Add(10, 20);
//	Add(10.1, 20.2);
//	f();
//	f(10);
//	f(10, 'a');
//	f('a', 10);
//	return 0;
//}



// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分 

//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}


//#include<stdio.h>
//#include<stdio.h>
//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 0;
//	int& b = a;
//	int& c = b;
//	int& d = c;
//	d++;
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	cout << &d << endl;
//
//	return 0;
//}


#include<stdio.h>
#include<stdio.h>
#include<iostream>
using namespace std;

//int main()
//{
//
//	int a = 10;
//	int& b = a;
//	int c = 0;
//	b = c;
//
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//	return 0;
//}




//#include<stdio.h>
//#include<stdio.h>
//#include<iostream>
//using namespace std;
//void Swap(int& x, int& y)
//{
//	int temp = x;
//	x = y;
//	y = temp;
//}
//int main()
//{
//	int x = 1;
//	int y = 2;
//	cout << x << " " << y << endl;
//	Swap(x, y);
//	cout << x << " " << y << endl;
//	return 0;
//}



//#include<iostream>
//
//using namespace std;
//
//inline int Add(int x, int y)
//{
//	int ret = x + y;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	return ret;
//}
//
//int main()
//{
//	// 可以通过汇编观察程序是否展开 
//	// 有call Add语句就是没有展开，没有就是展开了 
//	int ret = Add(1, 2);
//	cout << Add(1, 2) * 5 << endl;
//	return 0;
//}





#include<iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* ptr)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
		// 本想通过f(NULL)调⽤指针版本的f(int*)函数，但是由于NULL被定义成0，调⽤了f(int x)，因此与程序的初衷相悖。
	f(NULL);
	f((int*)NULL);
	// 编译报错：error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型 
	// f((void*)NULL);
	f(nullptr);
	return 0;
}
















